#ifndef LED_EFFECTS_H
#define LED_EFFECTS_H

#include <FastLED.h>
#include <stdint.h>
#include <algorithm> // 添加这个头文件以支持min/max函数
#include <cmath>     // 添加数学函数支持
#include "config.h"

// LED配置

#define DEFAULT_BRIGHTNESS 128

// 全局重置标志声明 - 用于段数变化时强制重置频谱静态数组
extern bool g_forceSpectrumReset;

// LED效果模式定义
enum LEDEffectMode
{
    LED_MODE_SOLID = 0,           // 单色效果
    LED_MODE_RAINBOW = 1,         // 彩虹效果
    LED_MODE_WATERFALL = 2,       // 瀑布效果
    LED_MODE_SPECTRUM = 3,        // 频谱效果
    LED_MODE_FIRE = 4,            // 火焰效果
    LED_MODE_RAINBOW_FLOW = 5,    // 七彩流水效果
    LED_MODE_RAINBOW_WAVE = 6,    // 彩虹波浪效果
    LED_MODE_ENERGY_PULSE = 7,    // 能量脉冲效果
    LED_MODE_FREQUENCY_SPLIT = 8, // 频率分离效果
    LED_MODE_MUSIC_PARTICLES = 9, // 音乐粒子效果
    LED_MODE_COUNT = 10 // 效果总数
};

// 效果类型定义
typedef LEDEffectMode EffectType;

// 粒子结构体定义
struct Particle
{
    float position;
    float velocity;
    uint8_t hue;
    uint8_t brightness;
    bool active;
};

class LEDController
{
public:
    void initMode();
    void checkAndUpdateMode();

    // 获取单例实例
    static LEDController &instance();

    // 效果控制
    void setMode(uint8_t mode);
    uint8_t getCurrentMode() const { return currentMode_; }
    void setBrightness(uint8_t brightness);
    void setColor(CRGB color);
    void setSpeed(uint8_t speed);
    void setBands(float *bands, uint8_t numBands);

    // 灯带模式处理方法
    void applyWallMode();
    void applyFlowMode();

    void update();

    // 频谱效果专用
    void updateSpectrum();

    // LED测试功能 - 逐个点亮LED验证配置
    void testLEDs();

    // 获取LED配置信息
    uint16_t getSegmentNum() const { return segmentNum_; }
    uint16_t getSegmentSize() const { return segmentSize_; }
    uint16_t getTotalLEDs() const { return segmentNum_ * segmentSize_; }

    // 更新LED配置
    void updateLEDConfig();

    // 重置频谱效果的静态数组 - 用于段数变化时清理状态
    void resetSpectrumStaticArrays();

    // 设置频谱灯柱方向
    void setSpectrumDirection(bool reversed) { spectrumReversed_ = reversed; }
    bool isSpectrumReversed() const { return spectrumReversed_; }

    // 获取频谱数据数组
    float *getBands() const { return bands_; }

private:
    LEDController();
    ~LEDController();

    // 禁止拷贝
    LEDController(const LEDController &) = delete;
    LEDController &operator=(const LEDController &) = delete;

    // 效果实现
    void updateRainbow();
    void updateWaterfall();
    void updateRainbowFlow();    // 七彩流水效果
    void updateRainbowWave();    // 彩虹波浪效果
    void updateEnergyPulse();    // 能量脉冲效果
    void updateFrequencySplit(); // 频率分离效果
    void updateMusicParticles(); // 音乐粒子效果

    // 成员变量
    static LEDController *instance_;
    CRGB leds_[LED_COUNT];
    uint8_t currentMode_ = 0;
    CRGB currentColor_ = CRGB::Black;
    uint8_t effectSpeed_ = 128;
    float *bands_ = nullptr;
    uint8_t numBands_ = 0;

    // LED分段配置
    uint16_t segmentSize_ = LED_SEGMENT_SIZE; // 每段LED数量
    uint16_t segmentNum_ = LED_SEGMENT_NUM;   // 总段数

    // 频谱效果状态
    float *smoothedBands = nullptr; // 改为动态分配，支持任意段数
    bool spectrumReversed_ = true; // 频谱灯柱方向，默认为从底部向上

    // 全局音量控制
    float globalVolumeLevel = 0.0f;                 // 当前全局音量水平
    static constexpr float volumeThreshold = 0.15f; // 音量阈值
    static constexpr float maxVolumeScale = 4.0f;   // 最大音量缩放倍数

    // 动态范围压缩参数
    static constexpr float minLevel = 0.01f; // 最小显示电平
    static constexpr float maxLevel = 1.0f;  // 最大显示电平

    // 彩虹效果状态
    uint8_t hue = 0;

    // 粒子系统
    static constexpr int MAX_PARTICLES = 20;
    Particle particles[MAX_PARTICLES];
    uint32_t lastSpawn = 0;

    unsigned long lastUpdateTime_ = 0;
};

// 获取模式名称的辅助函数
inline const char *getEffectName(EffectType effect)
{
    static const char *names[] = {
        "纯色模式",
        "彩虹模式",
        "瀑布模式",
        "频谱模式",
        "火焰模式",
        "七彩流水",
        "彩虹波浪",
        "能量脉冲",
        "频率分离",
        "音乐粒子"};
    if (effect >= 0 && effect < LED_MODE_COUNT)
    {
        return names[effect];
    }
    return "未知模式";
}

// 效果控制函数
bool initLEDEffects();
void updateLEDEffects(float currentVolume);
void showLEDEffects();
void setLEDEffectsColor(CRGB color);
void setLEDEffect(EffectType effect);
EffectType getCurrentEffect();
void setEffectSpeed(uint8_t speed);
void setBrightness(uint8_t brightness);
void setLedStripMode(LedStripMode mode);
void setColorScheme(uint8_t scheme);

// 效果常量
#define EFFECT_COUNT 10

// 当前灯带模式(枚举定义在config.h中)
extern LedStripMode currentLedStripMode;

#endif // LED_EFFECTS_H